package ru.spb.nicetu.altx.mnemo.extpoint.valuetypes;

import ru.spb.nicetu.altx.mnemo.math.managers.PerformanceManager;

/**
 * Абстрактная реализация интерфейса для прокси-ITemplateValueType.
 * Интерфейс ITemplateValueType реализуется посредством делегирования вызовов
 * реальному Значению.<br>
 * ++ Регистрация у PerformanceManager для анализа расходования памяти.
 */
abstract public class AProxyValueType implements IProxyValueType {

  //**************************************************************************//
  //                        Enums                                             //
  //**************************************************************************//

  //**************************************************************************//
  //                        Members                                           //
  //**************************************************************************//

  //**************************************************************************//
  //                        Constructors                                      //
  //**************************************************************************//
  public AProxyValueType() {
    // зарегистрируем себя для анализа расходования памяти
    PerformanceManager.getInstance().registerValue(this);
  }
  //**************************************************************************//
  //                        Getters                                           //
  //**************************************************************************//

  //**************************************************************************//
  //                        Setters                                           //
  //**************************************************************************//

  //**************************************************************************//
  //                        Publics                                           //
  //**************************************************************************//
  public Object get() {
    ITemplateValueType value =  getOriginalValue();
    return (value!= null) ? value.get() : null;
  }

  public String getName() {
    return getOriginalValue().getName();
  }

  public Class getType() {
    return getOriginalValue().getType();
  }

  public String getTypeName() {
    return getOriginalValue().getTypeName();
  }

  public void set(Object value) {
    getOriginalValue().set(value);
  }
  
  public ITemplateValueType clone() {
    AProxyValueType clone = null;

    try {
      clone = this.getClass().newInstance();
      clone.set(getOriginalValue().get());
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    return clone;
  }
  //**************************************************************************//
  //                        Abstracts                                         //
  //**************************************************************************//
  abstract public ITemplateValueType getOriginalValue();
  //**************************************************************************//
  //                        Protected                                         //
  //**************************************************************************//

  //**************************************************************************//
  //                        Privates                                          //
  //**************************************************************************//

  //**************************************************************************//
  //                        Public Statics                                    //
  //**************************************************************************//

  //**************************************************************************//
  //                        Private Statics                                   //
  //**************************************************************************//

  //**************************************************************************//
  //                        Internal Classes                                  //
  //**************************************************************************//
}
